import router from './router'
import { ElMessage, MessageParamsWithType } from 'element-plus'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken, removeToken } from '@/utils/auth'
import { isHttp } from '@/utils/validate'
import { isRelogin } from '@/utils/request'
import useUserStore from '@/store/modules/user'
import useSettingsStore from '@/store/modules/settings'
import usePermissionStore from '@/store/modules/permission'
import axios from 'axios'
import cache from '@/plugins/cache'

import { copyListener, removeCopy } from '@/hooks/web/banCopy'
NProgress.configure({ showSpinner: false })
// 检查更新
const checkVersion = async () => {
  const url = `/version.json?t=${Date.now()}`
  let res = null
  try {
    res = await axios.get(url)
  } catch (err) {
    console.error('checkVersion error: ', err)
  }
  let version = null
  if (res) {
    version = res.data.version
  }
  const localVersion = cache.local.get('sq_version')
  if (version && localVersion !== version) {
    cache.local.set('sq_version', version)
    window.location.reload()
  }
  cache.local.set('sq_version', version)
}
const isRefresh = import.meta.env.VITE_REFRESH

const whiteList = ['/login', '/register', '/phoneRecordSheet']
//@ts-ignore
router.beforeEach((to, from, next) => {
  // 检测版本更新
  if (from.path !== '/' && isRefresh) {
    checkVersion()
  }
  // 在免登录白名单，直接进入
  if (to.path === '/phoneRecordSheet') {
    if (to.query?.userid) {
      useUserStore()
        .captchaLoginFn({
          username: to.query?.userid,
          password: to.query?.userpass
        })
        .then(() => {
          next()
        })
        .catch(() => {
          removeToken()
          next('/login') // 否则全部重定向到登录页
        })
    } else {
      next()
    }
  } else {
    NProgress.start()
    if (getToken()) {
      // 客户模块禁止复制
      if (to.path.includes('customerManage')) {
        copyListener()
      } else {
        removeCopy()
      }
      to.meta.title && useSettingsStore().setTitle(to.meta.title)
      /* has token*/
      if (to.path === '/login') {
        next({ path: '/' })
        NProgress.done()
      } else {
        if (useUserStore().roles.length === 0) {
          isRelogin.show = true
          // 判断当前用户是否已拉取完user_info信息
          useUserStore()
            .getInfo()
            .then(() => {
              isRelogin.show = false
              usePermissionStore()
                .generateRoutes()
                .then((accessRoutes: any[]) => {
                  // 根据roles权限生成可访问的路由表
                  accessRoutes.forEach(route => {
                    if (!isHttp(route.path)) {
                      router.addRoute(route) // 动态添加可访问路由表
                    }
                  })
                  next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
                })
            })
            .catch((err: MessageParamsWithType) => {
              useUserStore()
                .logOut()
                .then(() => {
                  console.log(err)
                  ElMessage.error(err)
                  next({ path: '/' })
                })
            })
        } else {
          // 通讯录打开新窗口展示
          if (to.path === '/rsgl/other/addressList') {
            window.open('/addressList')
          } else {
            next()
          }
        }
      }
    } else {
      // 没有token
      if (whiteList.indexOf(to.path) !== -1) {
        next()
      } else {
        next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
        NProgress.done()
      }
    }
  }
})

router.afterEach(() => {
  NProgress.done()
})
